#include <vector>
#include <unordered_map>
using namespace std;
class Solution
{
public:
    int lengthOfLongestSubstring(string s)
    {
        //<key:字符,pair<上一次出现位置,出现次数>>
        unordered_map<int, pair<int, int>> u_map;
        // 结果
        int res = 0;
        // 有效区间的起始
        int p = 0;
        // 有效区间的末尾
        int i;
        // 遍历
        for (i = 0; i < s.size(); i++)
        {
            auto &first = u_map[s[i]].first;
            auto &second = u_map[s[i]].second;
            // 当条件不满足
            if (++first == 2)
            {
                // 更新结果
                res = max(i - p, res);
                // 更新区间
                p = max(second + 1, p);
                first--;
            }
            // 更新数据
            second = i;
        }
        res = max(i - p, res);
        return res;
    }
};